// 配置路由模块
import Vue from 'vue'
import VueRouter from 'vue-router'
// 引入路由信息 js
import routes from './routes.js'
// 引入 store
import store from '../store/store.js'
// 安装为插件
Vue.use(VueRouter)

// 重写 push  replace 方法  先把VueRouter原型对象的push,先保存一份
// 重写push|replace
// 第一个参数：告诉原来push方法，你往哪里跳转（传递哪些参数）
// 第二个参数：成功的回调
// 第三个参数：失败的回调
//  call || apply区别
//  相同点，都可以调用函数一次，都可以篡改函数的上下文一次
//  不同点：call与apply传递参数：call传递参数用逗号隔开，apply方法执行，传递数组

const originPush = VueRouter.prototype.push
const originReplace = VueRouter.prototype.replace

VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(this, location, () => {}, () => {
    })
  }
}

VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace.call(this, location, () => {}, () => {
    })
  }
}
// 配置路由
const router = new VueRouter({
  // 配置相关路由 key value 一直省略
  routes,
  // 路由跳转滚动行为
  scrollBehavior (to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  }
})
// 路由全局守卫  前置守卫 做路由跳转判断
// to:获取到要跳转到的路由信息  from：获取到从哪个路由跳转过来来的信息  next: next() 放行  next(path) 放行
router.beforeEach(async (to, from, next) => {
  // 直接放行
  // next()
  // 用户登录才有 token  未登录没有 token
  const token = store.state.User.token
  const name = store.state.User.userInfo.name
  if (token) {
    // 用户如果已经登录，则不能跳转到登录界面
    if (to.path === './login' || to.path === '/register') {
      next('/home')
    } else {
      if (name) {
        next()
      } else {
      // 没有用户信息 派发 action 让仓库存储用户信息再跳转
        try {
          // 获取用户信息成功 放行
          await store.dispatch('getUserInfo')
          next()
        } catch (error) {
          // token 失效了，需要重新登录
          await store.dispatch('userLogout')
          // 跳转到登录页面
          next('/login')
        }
      }
    }
  } else {
    // 未登录：不能去交易相关、不能去支付相关【pay|paysuccess】、不能去个人中心
    // 未登录去上面这些路由-----登录
    // 登录的路由组件 判断是否携带 query 参数 有：跳到 query 参数指定的路由 没有：跳转到 home
    const toPath = to.path
    if (toPath.indexOf('/trade') !== -1 || toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1) {
      // 把未登录的时候向去而没有去成的信息，存储于地址栏中【路由】
      next('/login?redirect=' + toPath)
    } else {
      // 去的不是上面这些路由（home|search|shopCart）---放行
      next()
    }
  }
})
// 对外暴露
export default router
